import log4js from "logger"; import { oauthManager } from '#server/service/oauth/oauth-manager'; import { setSessionCookie } from '#server/service/auth/cookie'; import { OAuthError } from '#server/service/oauth/oauth-error'; import { FRONTEND_LOGIN_PATH } from "common/config" const logger = log4js.getLogger("OAUTH"); export default defineWrappedResponseHandler(async (event) => { const providerName = getRouterParam(event, 'provider'); const query = getQuery(event); const { code, state } = query as { code?: string; state?: string }; logger.info(`[callback] Received callback: provider=${providerName}, hasCode=${!!code}, hasState=${!!state}`); if (query.error) { logger.warn(`[callback] Provider returned error: ${query.error}, description=${query.error_description ?? '-'}`); } if (!code || !state) { logger.warn(`[callback] Missing params: code=${!!code}, state=${!!state}`); return sendRedirect(event, `${FRONTEND_LOGIN_PATH}?oauth_error=missing_params`); } try { const result = await oauthManager.handleCallback(providerName!, code, state); if (result.sessionId) { setSessionCookie(event, result.sessionId); } logger.info(`[callback] Success: provider=${providerName}, isNewUser=${result.isNewUser}, hasSession=${!!result.sessionId}`); return sendRedirect(event, `${FRONTEND_LOGIN_PATH}?oauth_success=1`); } catch (error) { const errorCode = error instanceof OAuthError ? error.code : 'OAUTH_UNKNOWN'; logger.error(`[callback] Failed: provider=${providerName}, errorCode=${errorCode}`, error); return sendRedirect(event, `${FRONTEND_LOGIN_PATH}?oauth_error=${errorCode}`); } });